/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.uch.syscom.managedbeans;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import pe.edu.uch.syscom.hibernateSpringDao.HSClienteDAO;
import pe.edu.uch.syscom.managedbeans.uibeans.UIClienteBean;
import pe.edu.uch.syscom.managedbeans.uibeans.UIProductoBean;
import pe.edu.uch.syscom.mapping.*;
import pe.edu.uch.syscom.utils.CommonDAO;
import pe.edu.uch.syscom.utils.CommonWeb;
import pe.edu.uch.syscom.utils.ConstantesWeb;

/**
 *
 * @author Jose Tejada
 */
public class ModVentasMB {
    private int m_iIdClienteSelec;
    private int m_iIdCategoria;
    private int m_iIdSubCategoria;
    private String m_sCampoBusqueda;
    private String m_sDniCliente;
    private String m_sOncomplete;
    private UIProductoBean m_prodToAdd;
    private SelectItem[] m_cboCategorias;
    private SelectItem[] m_cboSubCategorias;
    private List<UIProductoBean> m_lstProductosSugeridos;
    private List<UIProductoBean> m_lstProductosSeleccionados;

    /**
     * Creates a new instance of ModVentasMB
     */
    public ModVentasMB() {
    }

    public int getIdClienteSelec() {
        return m_iIdClienteSelec;
    }

    public void setIdClienteSelec( int m_iIdClienteSelec ) {
        this.m_iIdClienteSelec = m_iIdClienteSelec;
    }

    public int getIdCategoria() {
        return m_iIdCategoria;
    }

    public void setIdCategoria( int iIdCategoria ) {
        m_iIdCategoria = iIdCategoria;
    }

    public int getIdSubCategoria() {
        return m_iIdSubCategoria;
    }

    public void setIdSubCategoria( int iIdSubCategoria ) {
        m_iIdSubCategoria = iIdSubCategoria;
    }

    public String getDniCliente() {
        return m_sDniCliente;
    }

    public void setDniCliente( String sDniCliente ) {
        m_sDniCliente = sDniCliente;
    }

    public String getOncomplete() {
        return m_sOncomplete;
    }

    public void setOncomplete( String sOncomplete ) {
        m_sOncomplete = sOncomplete;
    }

    public String getCampoBusqueda() {
        return m_sCampoBusqueda;
    }

    public void setCampoBusqueda( String m_sCampoBusqueda ) {
        this.m_sCampoBusqueda = m_sCampoBusqueda;
    }

    public UIProductoBean getProdToAdd() {
        return m_prodToAdd;
    }

    public void setProdToAdd( UIProductoBean prodToAdd ) {
        m_prodToAdd = prodToAdd;
    }

    public SelectItem[] getCboCategorias() {
        int iSizeCat;
        TbCategoria cat;
        List<TbCategoria> lstCategorias;

        try {
            lstCategorias = CommonDAO.getTbCategoriaDAO().listarCategorias();
            iSizeCat = lstCategorias.size();
            m_cboCategorias = new SelectItem[ iSizeCat + 1 ];
            for ( int i = 0; i < iSizeCat; i++ ) {
                cat = lstCategorias.get( i );
                m_cboCategorias[i + 1] = new SelectItem( cat.getIdCategoria(), cat.getDescripcion() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboCategorias == null ) {
                m_cboCategorias = new SelectItem[ 1 ];
            }
            m_cboCategorias[0] = new SelectItem( "0", "[Seleccionar Categoria]" );
        }

        return m_cboCategorias;
    }

    public void setCboCategorias( SelectItem[] cboCategorias ) {
        m_cboCategorias = cboCategorias;
    }

    public SelectItem[] getCboSubCategorias() {
        int iSizeSubCat;
        TbSubcategoria subCat;
        List<TbSubcategoria> lstSubCategorias;

        try {
            lstSubCategorias = CommonDAO.getTbCategoriaDAO().listarSubCategorias( m_iIdCategoria );
            iSizeSubCat = lstSubCategorias.size();
            m_cboSubCategorias = new SelectItem[ iSizeSubCat + 1 ];
            for ( int i = 0; i < iSizeSubCat; i++ ) {
                subCat = lstSubCategorias.get( i );
                m_cboSubCategorias[i + 1] = new SelectItem( subCat.getIdSubcategoria(), subCat.getDescripcion() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboSubCategorias == null ) {
                m_cboSubCategorias = new SelectItem[ 1 ];
            }
            m_cboSubCategorias[0] = new SelectItem( "0", "[Seleccionar Sub Categoria]" );
        }
        return m_cboSubCategorias;
    }

    public void setCboSubCategorias( SelectItem[] cboSubCategorias ) {
        m_cboSubCategorias = cboSubCategorias;
    }

    public List<UIProductoBean> getLstProductosSugeridos() {
        int iSizeProd;
        UIProductoBean proUI;
        List<TbProducto> lstProd;
        if ( m_lstProductosSugeridos == null ) {
            m_lstProductosSugeridos = new ArrayList<UIProductoBean>();
        }

        if ( m_sCampoBusqueda != null && m_sCampoBusqueda.trim().length() >= 3 ) {
            m_lstProductosSugeridos.clear();
            lstProd = CommonDAO.getTbProductoDAO().buscarProductos( m_iIdSubCategoria, m_sCampoBusqueda );
            iSizeProd = lstProd.size();
            for ( int i = 0; i < iSizeProd; i++ ) {
                proUI = new UIProductoBean();
                proUI.convertir( i + 1, lstProd.get( i ) );
                proUI.setCant( 1 );
                m_lstProductosSugeridos.add( proUI );
            }
        }

        return m_lstProductosSugeridos;
    }

    public void setLstProductosSugeridos( List<UIProductoBean> lstProdSug ) {
        m_lstProductosSugeridos = lstProdSug;
    }

    public List<UIProductoBean> getLstProductosSeleccionados() {
        if ( m_lstProductosSeleccionados == null ) {
            m_lstProductosSeleccionados = new ArrayList<UIProductoBean>();
        }
        return m_lstProductosSeleccionados;
    }

    public void setLstProductosSeleccionados( List<UIProductoBean> lstProdSelec ) {
        m_lstProductosSeleccionados = lstProdSelec;
    }

    //--ACCIONES
    public void nuevaVenta( ActionEvent event ) {

        m_sOncomplete = "Richfaces.showModalPanel('mpRegistroVenta')";
    }

    public void addProducto( ActionEvent event ) {
        int iIndexProd;
        int iSizeProd;
        int iIdProducto;
        UIProductoBean prodUI;

        try {
            iIdProducto = Integer.parseInt( CommonWeb.getParamFromUI( "idProducto" ) );
        } catch ( Exception ex ) {
            iIdProducto = -1;
        }
        if ( iIdProducto > 0 ) {
            iSizeProd = m_lstProductosSugeridos.size();
            for ( int i = 0; i < iSizeProd; i++ ) {
                prodUI = m_lstProductosSugeridos.get( i );
                iIndexProd = contieneProducto( m_lstProductosSeleccionados, prodUI.getIdProducto().intValue() );
                if ( iIndexProd == -1 ) {
                    if ( iIdProducto == prodUI.getIdProducto().intValue() ) {
                        prodUI.setNumOrden( m_lstProductosSeleccionados.size() + 1 );
                        m_lstProductosSeleccionados.add( prodUI );
                        break;
                    }
                } else {
                    m_lstProductosSeleccionados.get( iIndexProd ).setCant( prodUI.getCant() );
                }
            }
        }
        m_sOncomplete = "";
    }

    public void guardarVenta() {
        TbCliente tbCli;
        TbUsuario tbUsuario;
        TbVenta tbVenta;
        TbVentaDetalle tbVentDet;

        try {
            if ( !m_lstProductosSeleccionados.isEmpty() ) {
                
                tbCli = CommonDAO.getTbClienteDAO().findPorId( m_iIdClienteSelec );
                tbVenta = new TbVenta();
                tbUsuario = CommonWeb.getUsuarioSesion();
                tbVenta.setTbCliente( tbCli );
                tbVenta.setTbUsuario( tbUsuario );
                tbVenta.setFecha( new Date() );
                tbVenta.setEstado( ConstantesWeb.ESTADO_VENTA_PENDIENTE );
                tbVenta.setActivo( 1 );
                tbVenta.setTbVentaDetalles( new HashSet() );

                CommonDAO.getTbVentaDAO().guardarVenta( tbVenta );

                for ( UIProductoBean uiProductoBean : m_lstProductosSeleccionados ) {
                    tbVentDet = new TbVentaDetalle();
                    tbVentDet.setActivo( 1 );
                    tbVentDet.setCantidad( uiProductoBean.getCant() * 1.0 );
                    tbVentDet.setPrecioUnidad( uiProductoBean.getPrecioVenta() );
                    tbVentDet.setTbProducto( new TbProducto( uiProductoBean.getIdProducto() ) );
                    tbVentDet.setTbVenta( tbVenta );
                    CommonDAO.getTbVentaDAO().guardarVentaDetalle( tbVentDet );
                }
                m_sOncomplete = "javascript:Richfaces.hideModalPanel('mpRegistroVenta');alert('La venta se procesó correctamente, acérquese a caja a cancelar');";
                limpiarData();
            } else {
                m_sOncomplete = "javascript:alert('Error, venta null');";
            }
        } catch ( Exception ex ) {
//            m_log.error( "EX : " + ex );
//            m_log.error( "EX : " + ex.getMessage() );
            ex.printStackTrace();
        }
    }

    public void limpiarData() {
        m_lstProductosSeleccionados.clear();
        m_lstProductosSugeridos.clear();
        m_iIdCategoria = 0;
        m_iIdSubCategoria = 0;
        m_sCampoBusqueda = "";
        m_sDniCliente = "";
    }

    public void deleteProducto( ActionEvent event ) {
        int iIndexProd;
        int iIdProducto;

        try {
            iIdProducto = Integer.parseInt( CommonWeb.getParamFromUI( "idProducto" ) );
        } catch ( Exception ex ) {
            iIdProducto = -1;
        }
        if ( iIdProducto > 0 ) {
            iIndexProd = contieneProducto( m_lstProductosSeleccionados, iIdProducto );
            if ( iIndexProd >= 0 ) {
                m_lstProductosSeleccionados.remove( iIndexProd );
            }
        }
    }

    public List<UIClienteBean> autocomplete( Object suggestion ) {
        int iSizeCli;
        String sDatoBusq;
        HSClienteDAO clienteDAO;
        TbCliente tbCli;
        List<UIClienteBean> lstClientes;
        List<TbCliente> lstTbClientes;

        sDatoBusq = (String) suggestion;
        clienteDAO = CommonDAO.getTbClienteDAO();
        lstTbClientes = clienteDAO.buscarClientePorDNI( sDatoBusq );

        lstClientes = new ArrayList<UIClienteBean>();
        if ( lstTbClientes != null && !lstTbClientes.isEmpty() ) {
            iSizeCli = lstTbClientes.size();
            for ( int i = 0; i < iSizeCli; i++ ) {
                tbCli = lstTbClientes.get( i );
                UIClienteBean uiCliente = new UIClienteBean();
                uiCliente.setDni( tbCli.getDni() );
                uiCliente.setIdCliente( tbCli.getIdCliente() );
                uiCliente.setNombres( tbCli.getNombres() + ", " + tbCli.getApPaterno() + " " + tbCli.getApMaterno() );
                lstClientes.add( uiCliente );
            }
        }
        return lstClientes;
    }

    private int contieneProducto( List<UIProductoBean> lstProductos, int iIdProd ) {
        int iIndexProd;
        int iSizeProd;
        UIProductoBean prodAux;

        iIndexProd = -1;

        iSizeProd = lstProductos.size();

        for ( int i = 0; i < iSizeProd; i++ ) {
            prodAux = lstProductos.get( i );
            if ( prodAux.getIdProducto().intValue() == iIdProd ) {
                iIndexProd = i;
                break;
            }
        }

        return iIndexProd;
    }
}
